package com.feri.api.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.feri.api.config.RedisKeyConfig;
import com.feri.api.dao.GoodsDao;

import com.feri.api.dao.TypeDao;
import com.feri.api.dto.GoodsDto;
import com.feri.api.dto.GoodsQueryDto;
import com.feri.api.service.intf.GoodsService;
import com.feri.api.util.JedisUtil;
import com.feri.api.vo.PageVo;
import com.feri.api.vo.R;
import com.feri.common.entity.Goods;
import com.feri.common.entity.Goodstype;
import com.feri.common.entity.Type;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @Description:
 * @Author: 学习强国
 * @Date: 2022/10/02 13:26:55
 */
@Service
public class GoodsServiceImpl implements GoodsService {
    private final GoodsDao dao;
    private final TypeDao typeDao;

    public GoodsServiceImpl(GoodsDao dao, TypeDao typeDao) {
        this.dao = dao;
        this.typeDao = typeDao;
    }

    @Override
    public R save(GoodsDto dto) {
//        String title, Double oldprice, Double currprice, String imgurl, Integer num, String info, String tag
        Goods goods = new Goods(dto.getTitle(), dto.getOldprice(), dto.getCurrprice(), dto.getImgurl(), dto.getNum(), dto.getInfo(), dto.getTag(),dto.getTid());
        if(dao.insert(goods)>0){
            return R.ok();
        }else {
            return R.fail();
        }
    }

    @Override
    public R queryAll() {
        return R.ok(dao.selectList(new QueryWrapper<Goods>()));
    }

    @Override
    public R queryPage(GoodsQueryDto dto) {
        //1.验证参数
        if (dto != null){
            //2.实例化 条件构造器  实现查询条件生成
            QueryWrapper<Goods> queryWrapper = new QueryWrapper<>();
            //根据商品名称进行模糊查询
            queryWrapper.like("title",dto.getName());
            queryWrapper.eq("flag",4); //只查询上架的商品
//            //设置排序
//            queryWrapper.orderByDesc(dto.getField());
            //3.执行查询 获取分页结果
            Page<Goods> page=dao.selectPage(new Page<>(dto.getPage(),dto.getSize()),queryWrapper);
            //4.返回结果
            return R.ok(new PageVo<Goods>(page.getTotal(),page.getPages(),page.getRecords()));
        }
        return R.fail();
    }

    @Override
    public R detail(long id) {
        if (id>0){
            //基于Redis 实现缓存 设个有效 2小时
            String key= RedisKeyConfig.GOODS_DETAIL+id;
            if(JedisUtil.exists(key)){
                //缓存有 直接从缓存获取数据并返回
                return R.ok(JSON.parseObject(JedisUtil.getString(key),Goods.class));
            }else {
                //查询数据库
                Goods goods = dao.selectById(id);
                //更新缓存
                JedisUtil.addString(key,JSON.toJSONString(goods),RedisKeyConfig.GOODS_DETAIL_TIME);
                return R.ok(goods);
            }
        }else {
            return R.fail();
        }
    }

    @Override
    public R selectByType(String name) {
        if(StringUtils.hasLength(name)){
            Integer tid = typeDao.selectOne(new QueryWrapper<Type>().eq("name", name)).getId();
            QueryWrapper<Goods> wrapper = new QueryWrapper<Goods>().eq("tid", tid);
            return R.ok( dao.selectList(wrapper));
        }else {
            return R.fail();
        }
    }
}